/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.clie;

import com.perutaxi.entidades.eCliente;
import com.perutaxi.entidades.eSolicitudCliente;
import com.perutaxi.entidades.eUsuario;
import com.perutaxi.negocio.nCliente;
import com.perutaxi.negocio.nSolicitudCliente;
import com.perutaxi.negocio.nUsuario;
import com.perutaxi.util.GenericMBean;
import com.perutaxi.util.JavaMail;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author PeruTaxi
 */
@ManagedBean
@SessionScoped
public class SolicitudClienteMBean extends GenericMBean implements Serializable {

    private eSolicitudCliente solClienteFiltro;
    private eSolicitudCliente solCliente;
    private List<eSolicitudCliente> lista;
    private int accion; //1:nuevo, 2:editar, 3:ver
    private String titulo; //titulo del panel
    private final String url = "/pages/clie/solCliente/solicitudCliente.xhtml";
    private final String urlLista = "/pages/clie/solCliente/listaSolicitudCliente.xhtml";
    private SelectItem[] siEstadosFiltro;
    private SelectItem[] siEstadosSexo;
    private eCliente cliente;
    private int accionDetalle; //1:nuevo, 2:editar, 3:ver
    private Date fechaNacimiento;

    public SolicitudClienteMBean() {
    }

    public String iniciar() {
        solClienteFiltro = new eSolicitudCliente();
        solClienteFiltro.setDni("");
        solClienteFiltro.setEstado("");
        lista = null;

        return this.urlLista;
    }

    public void buscar(ActionEvent ae) {
        try {
            this.lista = nSolicitudCliente.obtenerSolCliente(this.solClienteFiltro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String editar() {
        this.accion = 2;
        this.titulo = "ACTUALIZAR SOLICITUD DE CLIENTE";

        return this.url;
    }

    public String ver() {
        this.accion = 3;
        this.titulo = "VER SOLICITUD DE CLIENTE";

        return this.url;
    }

    public String guardar() {
        if (this.accion == 2) {
            try {
                if (nSolicitudCliente.actualizar(this.solCliente)) {
                    showMessage("SE HA GUARDADO CORRECTAMENTE");
                    return this.editar();
                } else {
                    showError("ERROR AL MOMENTO DE GUARDAR");
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return "";
    }

    public void nuevoCliente() {
        this.accionDetalle = 1;
        cliente = nCliente.inicializar();
        cliente.setNombres(asignarNombres(this.solCliente.getNombres()));
        cliente.setApPaterno(asignarApPaterno(this.solCliente.getNombres()));
        cliente.setApMaterno(asignarApMaterno(this.solCliente.getNombres()));
        cliente.setDni(this.solCliente.getDni());
        cliente.setTelefono(this.solCliente.getTelefono());
        cliente.setDireccion(this.solCliente.getDireccion());
        cliente.setEmailPersonal(this.solCliente.getEmail());
    }

    public void guardarCliente() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            Long id = Long.valueOf(nCliente.obtenerTodos().size() + 1);
            this.cliente.setId(id);
            this.cliente = generarUsuario(this.cliente);
            this.solCliente.setEstado("C");
            nUsuario.guardar(this.cliente.getUsuario());
            if (nCliente.guardar(this.cliente)) {
                nSolicitudCliente.actualizar(this.solCliente);
                this.solCliente = nSolicitudCliente.obtenerPorId(this.solCliente.getId());
                enviarNotificacion(this.cliente);
                showMessage("SE HA GUARDADO CORRECTAMENTE");
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
                resultado = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        context.addCallbackParam("CallbackParam", resultado);
    }

    public String anular() {
        this.solCliente.setEstado("A");
        try {
            if (nSolicitudCliente.actualizar(this.solCliente)) {
                this.solCliente = nSolicitudCliente.obtenerPorId(this.solCliente.getId());
                showMessage("SE HA GUARDADO CORRECTAMENTE");
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return this.editar();
    }

    private void enviarNotificacion(eCliente empresa) {
        String asunto = "CONFIRMACIÓN DE REGISTRO";
        String mensaje = "ESTIMADO USUARIO, PERUTAXI AGRADECE SU PREFERENCIA. SU USUARIO PARA EL INGRESO A LA WEB ES: " + cliente.getUsuario().getUsuario();
        mensaje += " Y SU CLAVE ES: " + cliente.getUsuario().getClave();
        JavaMail.send(cliente.getEmailPersonal(), asunto, mensaje);
    }

    private eCliente generarUsuario(eCliente cliente) throws Exception {
        eUsuario usuario = new eUsuario();
        Long id = Long.valueOf(nUsuario.obtenerTodos().size() + 1);
        StringTokenizer tokens = new StringTokenizer(cliente.getNombres());
        String clave = id + tokens.nextToken();
        usuario.setId(id);
        usuario.setUsuario(cliente.getDni());
        usuario.setClave(clave);
        usuario.setIdRol(2L);
        usuario.setEstado(Boolean.TRUE);

        cliente.setUsuario(usuario);

        return cliente;
    }

    private String asignarNombres(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        String nombres = "";
        while (tokens.hasMoreTokens()) {
            String token = tokens.nextToken();
            l.add(token);
        }
        l.remove(l.size() - 1);
        l.remove(l.size() - 1);
        for (String x : l) {
            nombres = nombres + x + " ";
        }
        nombres = nombres.trim();

        return nombres;
    }

    private String asignarApPaterno(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        while (tokens.hasMoreTokens()) {
            l.add(tokens.nextToken());
        }
        l.remove(l.size() - 1);

        return l.get(l.size() - 1);
    }

    private String asignarApMaterno(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        while (tokens.hasMoreTokens()) {
            l.add(tokens.nextToken());
        }

        return l.get(l.size() - 1);
    }

    public String retroceder() {
        buscar(null);
        return this.urlLista;
    }

    public eSolicitudCliente getSolClienteFiltro() {
        return solClienteFiltro;
    }

    public void setSolClienteFiltro(eSolicitudCliente solClienteFiltro) {
        this.solClienteFiltro = solClienteFiltro;
    }

    public eSolicitudCliente getSolCliente() {
        return solCliente;
    }

    public void setSolCliente(eSolicitudCliente solCliente) {
        this.solCliente = solCliente;
    }

    public List<eSolicitudCliente> getLista() {
        return lista;
    }

    public void setLista(List<eSolicitudCliente> lista) {
        this.lista = lista;
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public SelectItem[] getSiEstadosFiltro() {
        SelectItem[] si = new SelectItem[4];
        si[0] = new SelectItem("*", "*");
        si[1] = new SelectItem("P", "PENDIENTE");
        si[2] = new SelectItem("C", "CONFIRMADO");
        si[3] = new SelectItem("A", "ANULADO");

        this.siEstadosFiltro = si;

        return siEstadosFiltro;
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public eCliente getCliente() {
        return cliente;
    }

    public void setCliente(eCliente cliente) {
        this.cliente = cliente;
    }

    public int getAccionDetalle() {
        return accionDetalle;
    }

    public void setAccionDetalle(int accionDetalle) {
        this.accionDetalle = accionDetalle;
    }

    public SelectItem[] getSiEstadosSexo() {
        SelectItem[] si = new SelectItem[3];
        si[0] = new SelectItem("H", "HOMBRE");
        si[1] = new SelectItem("M", "MUJER");
        si[2] = new SelectItem("O", "OTRO");
        siEstadosSexo = si;

        return siEstadosSexo;
    }

    public void setSiEstadosSexo(SelectItem[] siEstadosSexo) {
        this.siEstadosSexo = siEstadosSexo;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
        this.cliente.setFechaNacimiento(new Timestamp(this.fechaNacimiento.getTime()));
    }
}
